//
//  main.cpp
//  random1
//
//  Created by chenyh on 2021/2/19.
//

#include <iostream>
#include <string.h>

#define MAX 1024
using namespace std;
/*
【例 4-2】 设计一个程序，统计随机给出的字符串中的数字的个数、字母个数及其他
特殊字符的个数。
 【分析】这道题目可以利用对字符串进行遍历的方式来解决，具体代码如下
 */

/**统计函数*/
void cal_num(char *str,int count[])
{
    char *pstr;
    pstr = str;
    while (*pstr) { // *pstr != 0
        if (*pstr >= '0' && *pstr <= '9') {
            count[0]++;
        }else if((*pstr >= 'a' && *pstr<='z') || (*pstr >= 'A' && *pstr<='Z'))
            count[1]++;
        else
            count[2]++;
        pstr++;
    }
}
/*
int main(int argc, const char * argv[]) {
    char str[MAX];  //定义存储字符串的数组
    int i,count[3]; //0->num,1->char,2->others
    //初始化数组
    memset(count, 0, 3*sizeof(int));
    cout<<"输入字符串："<<endl;
    cin>>str;
    cal_num(str, count);
    for (i = 0; i < 3; i++) {
        switch(i)
                {
                case 0:
        cout<<"数字:"<<count[i]<<endl;
                    break;
                case 1:
        cout<<"字符:"<< count[i]<<endl;
                    break;
                case 2:
        cout<<"特殊字符:"<<count[i]<<endl;
        break; }
    }
    return 0;
}
*/
/**
 【例 4-3】 设计一个函数，将十进制数字转换成二进制或者 十六进制数字。
 【分析】数字的值是由两部分组成:数字和位权值。二进制就
 是位权值为 2 的幂的数，十六进制就是位权值为 16 的幂的数。我 们将十进制数进行转换的时候可以利用权值进行辗转相除，最后再乘以位权值得到新的进 制数，具体代码如下:
 */
int flag = 1;
/**转换函数*/
/*转换函数，直接转换成字符，然后进行权运算*/
void trans_num(int n,int d)
{
    int mod;
    mod=n%d; //n表示数字，d表示进制，辗转相除
    n=n/d;
    while(flag && n)
        trans_num(n,d);
    flag=0;
    if(mod>=10)
        mod=mod-10+65;
    else
        mod=mod+48;
    cout<<(char)mod;
}

int main()
{
    int n,d;
    cout<<"输入数字n和进制d："<<endl;
    cin>>n>>d;
    trans_num(n, d); //调用转换函数
    cout<<endl;
    return 0;
}
